import ccxt
import pandas as pd
from pathlib import Path

class DataLoader:
    """支持本地/实时数据加载"""
    
    def __init__(self, exchange='binance'):
        self.exchange = getattr(ccxt, exchange)()
        
    def load_historical_data(self, symbol, timeframe='1d', limit=1000):
        """从交易所获取历史数据"""
        data = self.exchange.fetch_ohlcv(symbol, timeframe, limit=limit)
        df = pd.DataFrame(data, columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
        # 将毫秒时间戳转为datetime (UTC时区)
        df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms',utc=True)
            # 按时间升序排列 (旧数据在前，新数据在后)
        df = df.sort_values('datetime').reset_index(drop=True)

        return df
        
    def save_to_csv(self, df, filename):
        """保存为Backtrader兼容格式"""
        Path("data/historical").mkdir(exist_ok=True)
        df.to_csv(f"data/historical/{filename}.csv", index=False)
        
    def get_realtime_data(self, symbol):
        """实时数据流 (WebSocket)"""
        # 需实现WebSocket连接
        pass

    def convert_csv(self,input_path,output_path,timeType='15m'):
        """
        转换数据格式：
        1. 毫秒时间戳 -> datetime字符串
        2. 数据顺序 新->旧 => 旧->新
        3. 保存为Backtrader兼容格式
        4. 转换时间级别到指定的时间级别
        """
        # 读取原始数据
        df = pd.read_csv(input_path)
        
        # 转换时间戳 (毫秒->datetime)
        df['datetime'] = pd.to_datetime(df['timestamp'], unit='ms')
        
        # 将时间戳设置为索引
        df.set_index('datetime', inplace=True)
        
        # 按时间升序排列 (旧数据在前)
        df = df.sort_index()
        
        # 转换为指定的时间级别
        # 使用 resample 进行聚合
        df_resampled = df.resample(timeType).agg({
            'open': 'first',
            'high': 'max',
            'low': 'min',
            'close': 'last',
            'volume': 'sum'
        })
        
        # 重置索引，以便将时间戳作为一列
        df_resampled.reset_index(inplace=True)
        
        # 选择需要的列
        output_df = df_resampled[['datetime', 'open', 'high', 'low', 'close', 'volume']]
        
        # 确保输出目录存在
        Path(output_path).parent.mkdir(parents=True, exist_ok=True)
        
        # 保存为CSV (不保留索引)
        output_df.to_csv(output_path, index=False)
        print(f"转换完成！文件已保存至: {output_path}")


if __name__ == '__main__':
    dataload = DataLoader()
    bicode = "BTC"
    timeType = '1d'

    input_path = f'./data/origin/{bicode}-USDT-SWAP_15m.csv'
    output_path = f'./data/historical/{bicode}-USDT-SWAP_{timeType}.csv'
    dataload.convert_csv(input_path,output_path,timeType)